/**
 * @file 	 eura_sd20x.h
 * @brief       
 * @author 	 wenbo
 * @version  1.0
 * @date 	 2022-04-22
 * 
 * @copyright Copyright (c) 2022  YGL
 * 
 */

#ifndef __EURA_H
#define __EURA_H

#include "../../bsp/bsp.h"
#define CHECK_ERR(a, str, goto_tag, ...)                                   	        \
    do {                                                                      	    \
        if (!(a))                                                          	        \
        {                                                                  	        \
            println(str, ##__VA_ARGS__);		                                    \
            goto goto_tag;                                                 	        \
        }                                                                  	        \
    } while (0)
 /**
  * @brief       故障代码及原因
  *
  *  序号    报警编号    报警名称 (原因)
  *  1	    AL-01       过流 (输出短或智能模块故障)			
  *  2	    AL-02       过压 (主电路流侧电压过高)			
  *  3	    AL-03       欠压 (主电路流侧电压过低)			
  *  4	    AL-04       硬件错误 (伺驱动器硬件故障)			
  *  5	    AL-05       电角度识别错 (电机线序错误)			
  *  6	    AL-06       电机过载 (连长时间输出大电流)			
  *  7	    AL-07       超速 (速过大)			
  *  8	    AL-08       驱动器过载动器负载过大)			
  *  9	    AL-09       位置环跟踪误差大 (位置环跟踪误差过大)			
  *  10	    AL-10       编码器故障 (伺服机编码器发生严重故障)			
  *  11	    AL-11       紧急停止 (外紧急停止端子有效)			
  *  12	    AL-12       驱动器过热 (驱器散热片温度过高)			
  *  13	    AL-13       主电路电源缺相相输入中某相电压过低)			
  *  14	    AL-14       能耗制动错误 (能耗制参数设置错误或连续长时间制动)			
  *  15	    AL-15       —— —)			
  *  16	    AL-16       输入端子设置重 (输入端子重复定义)			
  *  17	    AL-17       编码器断线(编码器断线)			
  *  18	    AL-18       转动惯量识别错误(转动惯量识别错误时报警)			
  *  19	    AL-19       编码器电池警 (编码器电池警告)			
  *  20	    AL-20       伺服电机E2ROM未初始化服电机E2ROM未初始化)			
  *  21	    AL-21       零漂过大 (漂超出设定值)			
  *  22	    AL-22       增量编码器Z相信号失 (增量编码器Z相信号缺失)			
  *  23	    AL-23       转矩失调保护 (输转矩与给定转矩偏差太大)			
  *  24	    AL-24       编码器电池报 (编码器电池报警)			
  *  25	    AL-25       电机过热 机发热严重)			
  *  26	    AL-26       电机温度检测断 (电机温度检测线缆断)			
  *  27	    AL-27       超程保护超程保护)			
  *  28	    AL-28       E2ROM错误 (E2RO误)			
  *  29	    AL-29       — ()			
  *  30	    AL-30       堵转保护 (伺电机出现堵转)			
  *  31	    AL-31       全闭环混合误差(全闭环混合误差过大)			
  *  32	    AL-32       龙门同步错误 (龙同步驱动器出现不同步情况)			
  *  33	    AL-33       电子凸轮错 (电子凸轮错误)			
  *  34	    AL-34       PLC (指令错误错误LC指令出现错误)			
  *  35	    AL-35       找原点超时误 (找原点超时)			
  *  36	    AL-36       参数拷贝错 (参数拷贝错误)			
  *  41	    AL-41       未检测到高阻 (8芯编码器线错误)			
  *  44	    AL-44       UVW (编码器信号丢失2500线编码器的UVW编码器信号丢失)			
  *  45	    AL-45       绝对值编码器分辨率错误 (1和23位编码器读取分辨率和设置参数不符)			
  *  46	    AL-46       绝对值编码器超速报警 (码器启动角加速度超过其允许最大加速值)			
  *  47	    AL-47       — ()			
  *  48	    AL-48       主电掉电 (主电断电一定时间之后外部仍给使能信号)			
  */


/**
 * @brief       eura_sd20x 伺服驱动 modbus 寄存器参数结构
 */
typedef struct {

    bool isInitOk;
    struct {
        uint8_t 	slave_id;    		    //modbus slave id
        uint8_t 	port;    			    //modbus uart port
        uint32_t 	speed;   			    //modbus uart speed
        uint8_t 	rec_data[20];    	    //modbus recive buffer
        uint8_t 	rec_len; 			    //modbus recive data length
    } com;
    uint16_t pos_mode_vel;
    uint8_t pos_ctrl_mode;
} eura_sd20_t;


/**
 * @brief       驱动器初始化
 * @param[in]	handle              驱动器 handle
 * @return      bool                true: 驱动器配置成功。 false: 可能因为通信故障失败
 */
extern bool xp_eura_init(eura_sd20_t* const handle);
/**
 * @brief       驱动器去初始化
 * @param[in]	handle              驱动器 handle
 * @return      bool                true
 */
extern bool xp_eura_Deinit(eura_sd20_t* const handle);


extern bool run_rel_pos(eura_sd20_t* const handle, int32_t rel_pos, uint16_t vel);

extern bool run_abs_pos(eura_sd20_t* const handle, int32_t abs_pos, uint16_t vel);
extern bool go_to_zero(eura_sd20_t* const handle);
extern bool pos_is_arrived(eura_sd20_t* const handle, uint32_t *pResult);

#endif
